import * as THREE from 'three';
import * as BufferGeometryUtils from 'three/addons/utils/BufferGeometryUtils.js';
const pointInPolygon = require('point-in-polygon');
import {lon2xyz} from "./math.js"
import Delaunator from 'delaunator';
// import {lon2xyz} from "./math.js"
// 生成网格点
const gridPoint = (polygonData)=>{
   var lonArr = [];//polygon的所有经度坐标
  var latArr = [];//polygon的所有纬度坐标
  polygonData.forEach(item=>{
    lonArr.push(item[0])
    latArr.push(item[1])
  })
  // 经纬度大小排序
  lonArr.sort((a,b)=>{return a-b})
  latArr.sort((a,b)=>{return a-b})
  // 获取经纬度的最大值、最小值
  var lonMin = lonArr[0]
  var lonMax = lonArr[lonArr.length-1]
  var latMin = latArr[0]
  var latMax = latArr[latArr.length-1]
  var rectPointsArr = [];//polygon对应的矩形轮廓内生成均匀间隔的矩形网格数据rectPointsArr
  // 在最大最小经纬度范围内生成点矩阵，每隔一个经纬度生成一个点
  for(var i= lonMin;i<lonMax +1;i+=3){
    for(var j= latMin;j<latMax + 1;j+=3){
      rectPointsArr.push([i,j])
    }
  }
  var polygonPointsArr = [];//处理点阵顶点坐标，用于生成几何体顶点坐标
  rectPointsArr.forEach(function (elem) {
    // 判断点是否在polygon内
    if(pointInPolygon(elem,polygonData)){
      polygonPointsArr.push(elem)
    }
  })
  // 将轮廓线上的点和内部的点合并
  return [...polygonData,...polygonPointsArr]
}
// 将网格点生成三角网格
const meshSanjiao = (R,polygonArr,name)=>{
  var geometryArr = [];//一个国家多个轮廓，每个轮廓对应的所有几何体
  polygonArr.forEach(obj=>{
    var polygon = obj[0];//获取多边形轮廓数据polygon
    // 轮廓线内部和线上的点
    const polygonPointsArr = gridPoint(polygon)
    var posArr = [];//处理polygonPointsArr，作为几何体顶点三维坐标
    polygonPointsArr.forEach(function (elem) {
      // 经纬度坐标转球面坐标
      var pos = lon2xyz(R, elem[0], elem[1])
        posArr.push(pos.x, pos.y, pos.z)
    })
    // 三角剖分
    // 平面上一系列点集三角剖分，并获取三角形索引值
    var indexArr = Delaunator.from(polygonPointsArr).triangles 
    var usefulIndexArr = [];//二次处理后三角形索引，也就是保留多边形polygon内部三角形对应的索引
    for(var i=0;i<indexArr.length;i+=3){
      // 三角形顶点坐标
      var p1 = polygonPointsArr[indexArr[i]]
      var p2 = polygonPointsArr[indexArr[i+1]]
      var p3 = polygonPointsArr[indexArr[i+2]]
      // 三角形的中心点坐标
      var centerPoint = [(p1[0]+p2[0]+p3[0])/3,(p1[1]+p2[1]+p3[1])/3]
      // 判断这个中心点是否在polygon内
      if(pointInPolygon(centerPoint,polygon)){
        usefulIndexArr.push(indexArr[i+2],indexArr[i+1],indexArr[i])
      }
  }
  // 三角形的全部索引值
  const geometry = new THREE.BufferGeometry();
  geometry.index = new THREE.BufferAttribute(new Uint16Array(usefulIndexArr), 1);
  geometry.attributes.position = new THREE.BufferAttribute(new Float32Array(posArr), 3); 
  geometryArr.push(geometry)
  })
  
// 合并几何体
var newGeometry = null
if(geometryArr.length == 1){
  newGeometry = geometryArr[0]
}else{
  newGeometry = BufferGeometryUtils.mergeBufferGeometries(geometryArr)
}
newGeometry.computeVertexNormals ();//如果使用受光照影响材质，需要计算生成法线
  var material = new THREE.MeshLambertMaterial({
    color: 0x002222,
    side: THREE.DoubleSide, //背面可见，默认正面可见   THREE.DoubleSide：双面可见
    })
    var mesh = new THREE.Mesh(newGeometry, material)
    mesh._name = name
    return mesh
}
export {meshSanjiao};